"""
re模块：
match : 从开头匹配
search : 只匹配一次
findall : 查找所有
sub : 替换内容
split : 切割内容

常用正则匹配符号：
. : 用于匹配除换行符（\n）之外的所有字符
^ : 用于匹配字符串的开始，即行首
$ : 用于匹配字符串的末尾（末尾如果有换行符\n,就匹配\n前面的那个字符），即行尾
* : 用于将前面的模式匹配0此或多次 （贪婪模式，即尽可能多的匹配）
+ : 用于将前面的模式匹配1次或多次（贪婪模式）
？: 用于将前面的模式匹配0次或1次（贪婪模式）
*？ +？ ？？ : 即上面三种特殊字符的非贪婪模式（尽可能少的匹配）
{m,n} : 用于将前面的模式匹配m次盗n次（贪婪模式），即最小匹配m次，最大匹配n次
{m,} : 大于等于m次
{m,n}? : 即上面{m,n}的非贪婪版本

贪婪与非贪婪模式：
贪婪模式 ： 默认为贪婪模式，就是尽可能多的匹配内容
非贪婪模式 ： 尽可能少的匹配内容
    在 * ？ + {m,n} 后面加上？,使贪婪变为非贪婪
"""
import re

msg = "abc"
pattern = re.compile("b")
result = pattern.match(msg)  # match只能从头部开始匹配
print(result)
result = re.search(pattern, msg)  # 匹配整个字符串,找到一个就不会再往下找
print(result)
print(result.span())  # 返回位置
print(result.group())  # 返回匹配的内容

# search 匹配了一个就不会继续向下匹配了
s = "hk1jhk123jklkl321kjlj2klj2klkj23213k23232"
result = re.search('[a-z][0-9][a-z]', s)
print(result.group())
# findall会匹配出所有的选项
result = re.findall('[a-z][0-9]+[a-z]', s)
print(result)

qq = "2294625664"
r = re.match("^[1-9][]0-9]{5,}$", qq)
print(r.group())

# 分组
"""
| : 或者
() : 在小括号里面的|表示或者
[] : 在中括号里面的|表示一个匹配符合
"""
# 匹配0-100数字
n = "100"
s = re.match(r'[1-9]?\d?$|100$', n)
print(s)
# 匹配邮箱
email = "2294625664@qq.com"
s = re.match(r'\w{5,20}@(163|qq|126)\.(com|cn)', email)
print(s)

# 分组,结合（）小括号使用
phone = '010-12345678'
s = re.match(r'(\d{3}|\d{4})-(\d{8})$', phone)
print(s)
# 分别提取除区号和电话号码
print(s.group(1))
print(s.group(2))
# 分组常用于爬虫匹配内容
html = "<html>hello world</html>"
r = re.match(r'<[0-9a-zA-Z]+>(.+)</[0-9a-zA-Z]+>$', html)
print(r)
print(r.group(1))  # 获取到标签中的内容

# 分组+number进行匹配
html = "<html>hello world</html>"
r = re.match(r'<([0-9a-zA-Z]+)>(.+)</\1>$', html)  # 这儿的\1表示引用第一个括号里面的正则
print(r)
print(r.group(1))
print(r.group(2))
# 给分组取别名 ---> (?P<name>)
html = "<html>hello world</html>"
r = re.match(r'<(?P<name1>[0-9a-zA-Z]+)>(?P<name2>.+)</(?P=name1)>$', html)
print(r.group())

"""
正则替换sub：
    sub(正则表达式，’新内容‘,'原始内容')
    sub(正则表达式，函数,'原始内容')
"""

result = re.sub(r"\d+", '90', 'java:80,python:60')
print(result)


def func(temp):
    num = temp.group()
    num1 = int(num) + 1
    return str(num1)


result = re.sub(r"\d+", func, 'java:80,python:60')
print(result)

"""
split:按照正则对内容进行切割
"""
r = re.split(r'[,:]', 'java:80,python:60')
print(r)

# 贪婪与非贪婪
msg = "abc123"
r = re.match(r'abc(\d+)', msg)  # 贪婪模式
print(r)
r = re.match(r'abc(\d+?)', msg)  # 非贪婪模式
print(r)
